<?php

namespace app\index\controller;

use app\BaseController;
use Bluerhinos\phpMQTT;
use Workerman\Mqtt\Client;
use Workerman\Worker;


class Mqtt extends BaseController

{


    /**

     * MQTT发送信息

     * @param $id   发布消息的ID 订阅ID需要与发布ID一致才能接受信息 topic为发布给全部

     * @param $info 发布的信息

     */

    public function pus($id,$info){
        //使用require_once 引入 MQTT 的类


        $host = "0.0.0.0";     // change if necessary   IP

        $port = 1883;                     // change if necessary    端口默认1883

        $username = "";                   // set your username 用户名

        $password = "";                   // set your password 密码

        $message = $info; //要发送的消息

        //phpMQTT有四个参数：主机，端口，客户端id，证书。官网这里的案例没写证书，请参考phpMQT类

        //没有证书的时候只能连接1883端口，不能连接8883端口。

        //第三个参数为客户端ID 不可重复

        $mqtt = new phpMQTT($host, $port, "ClientID" . rand());

        //连接

        if ($mqtt->connect(true, NULL, $username, $password)) {



            //发送信息  第三个参数为Qos服务质量等级

            //Qos0  　发送者只发送一次消息，不进行重试，Broker不会返回确认消息。在Qos0情况下，Broker可能没有接受到消息

            //Qos1  　发送者最少发送一次消息，确保消息到达Broker，Broker需要返回确认消息PUBACK。在Qos1情况下，Broker可能接受到重复消息

            //Qos2  　Qos2使用两阶段确认来保证消息的不丢失和不重复。在Qos2情况下，Broker肯定会收到消息，且只收到一次

            $mqtt->publish($id, $message, 0);

            $mqtt->close(); //关闭

        } else {

            echo "Fail or time out<br />";

        }

    }



    /**



     * 要使用命令行运行此方法！！！



     *  think5.0 运行方法为 cd到Public 目录  然后  php index.php 模块/控制器/方法



     * 该类主要为订阅，建议订阅代码和发布代码不要写在同一个类中，避免修改造成不必要的误改。

     * 每次更新该类后需要重启mqtt订阅，否则新的改动不会生效。

     * 请在相应的位置放入phpMQTT的库

     * 库代码：https://github.com/bluerhinos/phpMQTT/blob/master/phpMQTT.php

     * 类库使用的时候注意命名空间，类名称命名要和thinkphp的保持一致，不然会报错

     */

    public function sub(){

//        require_once (EXTEND_PATH.'/phpMQTT-master/phpMQTT.php');

        $server = "172.31.53.163";     // change if necessary 服务器IP

        $port = 1883;                     // change if necessary    端口 一般是1883

        $username = "";                   // set your username mosquitto设置的用户名

        $password = "";                   // set your password mosquitto设置的密码

        $client_id = "clientx9293670xxctr".rand(1213333123,123123333); //你的连接客户端id



        $mqtt = new phpMQTT($server, $port, $client_id);    //进行连接



        if(!$mqtt->connect(true, NULL, $username, $password)) {

            exit('error');   //连接失败

        } else {

            echo "success"; //连接成功

        }

        //topics["topic"]  为接受的主题名  需要和发送的主题名一致  否则会订阅不到

        //订阅信息 Qos为信息登记，需要和发送的等级一致

        $topics["topic"] = array("qos" => 0, "function" =>array($this,"onMessage"));



        $mqtt->subscribe($topics, 0);



        //死循环监听

        while($mqtt->proc()){



        }

        $mqtt->close();

    }

    /**

     * 在此处接MQtt的信息 进行业务处理

     * @param $topic

     * @param $msg

     */

    function onMessage($topic,$msg){

        $msg = json_decode($msg,true);

        //我把数据传递到了另一个方法进行处理  可以在处理完逻辑业务之后 再次调用发布方法  去给订阅方发布消息

        $this->index($msg);

    }

}